package fr.insta.reverse.uml.service;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.Proxy;
import java.net.URL;
import java.util.HashMap;
import java.util.List;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;

import fr.insta.reverse.uml.bean.Projet;
import fr.insta.reverse.uml.bean.User;
import fr.insta.reverse.uml.dao.DaoFactory;
import fr.insta.reverse.uml.dao.DaoName;
import fr.insta.reverse.uml.dao.DaoProjet;
import fr.insta.reverse.uml.util.IhmValues;
import fr.insta.reverse.uml.util.InstaUtils;

public class ServiceProject implements IService<Projet>
{
	DaoProjet dao = (DaoProjet) DaoFactory.getDao(DaoName.Project);

	@Override
	public Projet get(int _id)
	{
		return dao.findById(_id);
	}

	@Override
	public List<Projet> getObjects()
	{
		return dao.getAll();
	}

	@Override
	public boolean delete(Projet _object)
	{
		return dao.remove(_object);
	}

	@Override
	public Projet insert(Projet _object)
	{
		return dao.save(_object);
	}

	@Override
	public Projet update(Projet _object)
	{
		return dao.save(_object);
	}

	public void insertForm(HashMap<String, Object> listParameters)
	{
		Projet projet = new Projet();

		projet.setLib(listParameters.get(IhmValues.FORM_UML_CREATE_NAME).toString());
	}

	public Projet getByImageHash(String _hash)
	{
		return dao.findByImageHash(_hash);
	}

	public String getMessageErrorForNewProject(Projet _project)
	{
		String message = null;

		if (_project.getLib() == null || _project.getLib().length() < 3)
			message = "Le nom de votre projet est trop court.";

		if (_project.getProp() == null)
			message = "Erreur sur le proprietaire du projet.";

		if (_project.getVisibilite() == null)
			message = "Erreur sur le visibilitée du projet.";

		if (_project.getImgHash() == null)
			message = "Erreur sur l'image";

		//if (this.findByLibAndUser(_project) != null)
		//	message = "Un projet avec le même nom existe déjà.";

		return message;
	}

	public List<Projet> listUserProjects(User usr)
	{
		return dao.getUserProjects(usr);
	}

	public List<Projet> listUserAndPublicProjects(User usr)
	{
		return dao.getUserAndPublicProjects(usr);
	}

	public List<Projet> listPublicProjects()
	{
		return dao.getPublicProjects();
	}

	public List<Projet> listProjectsByLib(Projet prj)
	{
		return dao.getByLib(prj);
	}

	public Projet findByLibAndUser(Projet prj)
	{
		Projet byLibAndUser = dao.getByLibAndUser(prj);

		System.out.println(byLibAndUser);

		return byLibAndUser;
	}

	public void insertImageProject(HttpServletRequest request, Projet _project, String _imgName) throws IOException
	{
		if (_project != null && _imgName != null)
		{
			_project.setImgHash(null);
			_project.setImg(_imgName);

			System.out.println("INSERT IMAGE : " + _imgName);

			URL url = new URL("http://yuml.me/" + _imgName);

			Proxy proxy = InstaUtils.getProxyIfNeeded();

			HttpURLConnection connection = (HttpURLConnection) url.openConnection(proxy != null ? proxy : Proxy.NO_PROXY);

			BufferedImage image = ImageIO.read(connection.getInputStream());

			String img = "/WEB-INF/img_uml/" + _imgName + ".png";
			String pathImg = request.getServletContext().getRealPath(img);

			System.out.println(pathImg);

			ImageIO.write(image, "png", new File(pathImg));

			update(_project);

			System.out.println(image);
			System.out.println("Image Inserted");
		}
	}

	public File getImageProject(int _idProject, HttpServletRequest _request) throws IOException
	{

		Projet project = get(_idProject);

		if (project == null)
			return null;

		String img = "/WEB-INF/img_uml/" + project.getImg() + ".png";
		String pathImg = _request.getServletContext().getRealPath(img);

		return new File(pathImg);
	}
}